/**
 * Copyright (C), 2015-2019, XXX有限公司
 * FileName: ResultUtil
 * Author:   步步为莹
 * Date:     2019/8/17 21:30
 * Description: 结果集操作类
 * History:
 */
package cn.beyond.vehicleManagement.util;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

/**
 * 〈结果集操作类〉<br> 
 * 〈一句话功能简述〉
 *
 * @author 步步为莹
 * @create 2019/8/17
 * @since 1.0.0
 */
public class ResultUtil {

    /**
     * 将结果集添加到集合
     * @param resultSet
     * @param t1
     * @param <T>
     * @return
     */
    public static <T> List<T> resultToList(ResultSet resultSet, T t1) {
        //创建一个 T 类型的数组
        List<T> list = new ArrayList<>();
        try {
            //通过反射获取对象的实例
             Class clazz=t1.getClass();

            //获取resultSet 的列的信息
            ResultSetMetaData metaData = resultSet.getMetaData();
            //遍历resultSet
            while (resultSet.next()) {
                T t = (T) clazz.getConstructor().newInstance();
                PropertyDescriptor pd=null;
                for (int i = 0; i < metaData.getColumnCount(); i++) {
                        //获取列的名字
                        String fName = metaData.getColumnLabel(i + 1);
                        //因为列的名字和我们EMP中的属性名是一样的，所以通过列的名字获得其EMP中属性
                       // Field field = clazz.getDeclaredField(fName.replace('_',' '));
                         Field field = clazz.getDeclaredField(fName);
                        //因为属性是私有的，所有获得其对应的set 方法。set+属性名首字母大写+其他小写
                         pd=new PropertyDescriptor(field.getName(),clazz);
                         //属性获取器
                        //获取set方法
                         Method setMethod=pd.getWriteMethod();
                        //执行set方法，把resultSet中的值传入emp中，  再继续循环传值
                        setMethod.invoke(t, resultSet.getObject(fName));
                    }

                    //把赋值后的对象 加入到list集合中
                    list.add(t);

                //遍历每一列

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回list
        return list;
    }

    /**
     *按结果集返回对象
     * @param resultSet
     * @param t1
     * @param <T>
     */
    public static <T>T resultToObject(ResultSet resultSet, T t1) {
        T t=null;
        try {
            //通过反射获取对象的实例
            Class clazz=t1.getClass();
             t = (T) clazz.getConstructor().newInstance();
            //获取resultSet 的列的信息
            ResultSetMetaData metaData = resultSet.getMetaData();
            //遍历resultSet
            if (resultSet.next()&&resultSet!=null) {
                //遍历每一列
                PropertyDescriptor pd=null;
                for (int i = 0; i < metaData.getColumnCount(); i++) {
                    //获取列的名字
                    String fName = metaData.getColumnLabel(i + 1);
                    //因为列的名字和我们EMP中的属性名是一样的，所以通过列的名字获得其EMP中属性
                    //Field field = clazz.getDeclaredField(fName.replace('_',' '));
                    Field field=clazz.getDeclaredField(fName);
                    pd=new PropertyDescriptor(field.getName(),clazz);
                    Method setMethod =pd.getWriteMethod();
                    //执行set方法，把resultSet中的值传入emp中，  再继续循环传值
                    setMethod.invoke(t, resultSet.getObject(fName));
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回list
        return t;
    }
}